home *** CD-ROM | disk | FTP | other *** search
/ Aminet 35 / Aminet 35 (2000)(Schatztruhe)[!][Feb 2000].iso / Aminet / dev / src / td01_src.lha / td_r0.1 / source / StartUp.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-04-19  |  10.4 KB  |  343 lines

  1. /*
  2. **      $VER: StartUp.c 0.2 (28.03.99)
  3. **
  4. **      Library startup-code and function table definition
  5. **
  6. **      (C) Copyright 1996-98 Andreas R. Kleinert
  7. **      All Rights Reserved.
  8. **
  9. **      Modified by Stephan Bielman for 3do library.
  10. **
  11. **      Creation date     : 11.4.99
  12. **      Last modification : 18.4.99
  13. **
  14. */
  15.  
  16. #define __USE_SYSBASE        // perhaps only recognized by SAS/C
  17.  
  18. #include <exec/types.h>
  19. #include <exec/memory.h>
  20. #include <exec/libraries.h>
  21. #include <exec/execbase.h>
  22. #include <exec/resident.h>
  23. #include <exec/initializers.h>
  24.  
  25.  
  26. #ifdef __MAXON__
  27. #include <pragma/exec_lib.h>
  28. #include <linkerfunc.h>
  29. #else
  30. #include <proto/exec.h>    // all other compilers
  31. #endif
  32. #include "compiler.h"
  33.  
  34.  
  35. #ifdef __GNUC__
  36. #include "../dev/include/meshwrier/tdoBase.h"
  37. #elif VBCC
  38. #include "include/tdo/tdoBase.h"
  39. #else
  40. #include "include/tdo/tdoBase.h"
  41. #endif
  42.  
  43. #include "tdo.h"
  44.  
  45.  
  46. extern ULONG __saveds __stdargs L_OpenLibs(struct tdoBase *tdoBase);
  47. extern void  __saveds __stdargs L_CloseLibs(void);
  48.  
  49. struct tdoBase * __saveds ASM InitLib( register __a6 struct ExecBase    *sysbase GNUCREG(a6),
  50.                                            register __a0 SEGLISTPTR          seglist GNUCREG(a0),
  51.                                            register __d0 struct tdoBase *tdb     GNUCREG(d0));
  52. struct tdoBase * __saveds ASM OpenLib( register __a6 struct tdoBase *tdoBase GNUCREG(a6));
  53. SEGLISTPTR __saveds ASM CloseLib( register __a6 struct tdoBase *tdoBase GNUCREG(a6));
  54. SEGLISTPTR __saveds ASM ExpungeLib( register __a6 struct tdoBase *tdb GNUCREG(a6));
  55. ULONG ASM ExtFuncLib(void);
  56.  
  57.  
  58. /* ----------------------------------------------------------------------------------------
  59.    ! LibStart:
  60.    !
  61.    ! If someone tries to start a library as an executable, it must return (LONG) -1
  62.    ! as result. That's what we are doing here.
  63.    ---------------------------------------------------------------------------------------- */
  64.  
  65. LONG ASM LibStart(void)
  66. {
  67.  return(-1);
  68. }
  69.  
  70.  
  71. /* ----------------------------------------------------------------------------------------
  72.    ! Function and Data Tables:
  73.    !
  74.    ! The function and data tables have been placed here for traditional reasons.
  75.    ! Placing the RomTag structure before (-> LibInit.c) would also be a good idea,
  76.    ! but it depends on whether you would like to keep the "version" stuff separately.
  77.    ---------------------------------------------------------------------------------------- */
  78.  
  79. extern APTR FuncTab [];
  80. /*extern struct MyDataInit DataTab;  */
  81. extern DataTab; /* DICE fix */
  82.                                   /* Instead you may place ROMTag + Datatab directly, here */
  83.                                   /* (see LibInit.c). This may fix "Installer" version     */
  84.                                   /* checking problems, too - try it.                      */
  85.  
  86. struct InitTable                       /* do not change */
  87. {
  88.  ULONG              LibBaseSize;
  89.  APTR              *FunctionTable;
  90.  struct MyDataInit *DataTable;
  91.  APTR               InitLibTable;
  92. } InitTab =
  93. {
  94.  (ULONG)               sizeof(struct tdoBase),
  95.  (APTR              *) &FuncTab[0],
  96.  (struct MyDataInit *) &DataTab,
  97.  (APTR)                InitLib
  98. };
  99.  
  100. APTR FuncTab [] =
  101. {
  102.  OpenLib,
  103.  CloseLib,
  104.  ExpungeLib,
  105.  ExtFuncLib,
  106.  
  107.  tdoMeshNew,
  108.  tdoMeshDelete,
  109.  tdoMeshNameSet,
  110.  tdoMeshNameGet,
  111.  tdoMeshCopyrightSet,
  112.  tdoMeshCopyrightGet,
  113.  tdoMeshNofMaterialsGet,
  114.  tdoMeshNofPartsGet,
  115.  tdoMeshNofPolygonsGet,
  116.  tdoMeshNofVerticesGet,
  117.  tdoCTMReset,
  118.  tdoTranslationChange,
  119.  tdoTranslationGet,
  120.  tdoScaleChange,
  121.  tdoScaleGet,
  122.  tdoRotationChange,
  123.  tdoRotationGet,
  124.  tdoMaterialAdd,
  125.  tdoMaterialNameSet,
  126.  tdoMaterialNameGet,
  127.  tdoMaterialAmbientColorSet,
  128.  tdoMaterialAmbientColorGet,
  129.  tdoMaterialDiffuseColorSet,
  130.  tdoMaterialDiffuseColorGet,
  131.  tdoMaterialShininessSet,
  132.  tdoMaterialShininessGet,
  133.  tdoMaterialTransparencySet,
  134.  tdoMaterialTransparencyGet,
  135.  
  136.  
  137.  (APTR) ((LONG)-1)
  138. };
  139.  
  140.  
  141. extern struct tdoBase *tdoBase;
  142.  
  143. /* ----------------------------------------------------------------------------------------
  144.    ! InitLib:
  145.    !
  146.    ! This one is single-threaded by the Ramlib process. Theoretically you can do, what
  147.    ! you like here, since you have full exclusive control over all the library code and data.
  148.    ! But due to some bugs in Ramlib V37-40, you can easily cause a deadlock when opening
  149.    ! certain libraries here (which open other libraries, that open other libraries, that...)
  150.    !
  151.    ---------------------------------------------------------------------------------------- */
  152.  
  153. struct tdoBase * __saveds ASM InitLib( register __a6 struct ExecBase      *sysbase GNUCREG(a6),
  154.                                            register __a0 SEGLISTPTR            seglist GNUCREG(a0),
  155.                                            register __d0 struct tdoBase   *tdb     GNUCREG(d0))
  156. {
  157.  tdoBase = tdb;
  158.  
  159.  tdoBase->tdb_SysBase = sysbase;
  160.  tdoBase->tdb_SegList = seglist;
  161.  
  162.  if(L_OpenLibs(tdoBase)) return(tdoBase);
  163.  
  164.  L_CloseLibs();
  165.  
  166.   {
  167.    ULONG negsize, possize, fullsize;
  168.    UBYTE *negptr = (UBYTE *) tdoBase;
  169.  
  170.    negsize  = tdoBase->tdb_LibNode.lib_NegSize;
  171.    possize  = tdoBase->tdb_LibNode.lib_PosSize;
  172.    fullsize = negsize + possize;
  173.    negptr  -= negsize;
  174.  
  175.    FreeMem(negptr, fullsize);
  176.  
  177.    #ifdef __MAXON__
  178.    CleanupModules();
  179.    #endif
  180.   }
  181.  
  182.  return(NULL);
  183. }
  184.  
  185. /* ----------------------------------------------------------------------------------------
  186.    ! OpenLib:
  187.    !
  188.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  189.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  190.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  191.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  192.    ! function.
  193.    !
  194.    ! Currently you only can bypass this restriction by supplying your own semaphore
  195.    ! mechanism.
  196.    ---------------------------------------------------------------------------------------- */
  197.  
  198. struct tdoBase * __saveds ASM OpenLib( register __a6 struct tdoBase *tdoBase GNUCREG(a6))
  199. {
  200.  #ifdef __MAXON__
  201.  GetBaseReg();
  202.  InitModules();
  203.  #endif
  204.  
  205.  tdoBase->tdb_LibNode.lib_OpenCnt++;
  206.  
  207.  tdoBase->tdb_LibNode.lib_Flags &= ~LIBF_DELEXP;
  208.  
  209.  return(tdoBase);
  210. }
  211.  
  212. /* ----------------------------------------------------------------------------------------
  213.    ! CloseLib:
  214.    !
  215.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  216.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  217.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  218.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  219.    ! function.
  220.    !
  221.    ! Currently you only can bypass this restriction by supplying your own semaphore
  222.    ! mechanism.
  223.    ---------------------------------------------------------------------------------------- */
  224.  
  225. SEGLISTPTR __saveds ASM CloseLib( register __a6 struct tdoBase *tdoBase GNUCREG(a6))
  226. {
  227.  tdoBase->tdb_LibNode.lib_OpenCnt--;
  228.  
  229.  if(!tdoBase->tdb_LibNode.lib_OpenCnt)
  230.   {
  231.    if(tdoBase->tdb_LibNode.lib_Flags & LIBF_DELEXP)
  232.     {
  233.      return( ExpungeLib(tdoBase) );
  234.     }
  235.   }
  236.  
  237.  return(NULL);
  238. }
  239.  
  240. /* ----------------------------------------------------------------------------------------
  241.    ! ExpungeLib:
  242.    !
  243.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  244.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  245.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  246.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  247.    ! function.
  248.    !
  249.    ! Currently you only could bypass this restriction by supplying your own semaphore
  250.    ! mechanism - but since expunging can't be done twice, one should avoid it here.
  251.    ---------------------------------------------------------------------------------------- */
  252.  
  253. SEGLISTPTR __saveds ASM ExpungeLib( register __a6 struct tdoBase *tdb GNUCREG(a6))
  254. {
  255.  struct tdoBase *tdoBase = tdb;
  256.  SEGLISTPTR seglist;
  257.  
  258.  if(!tdoBase->tdb_LibNode.lib_OpenCnt)
  259.   {
  260.    ULONG negsize, possize, fullsize;
  261.    UBYTE *negptr = (UBYTE *) tdoBase;
  262.  
  263.    seglist = tdoBase->tdb_SegList;
  264.  
  265.    Remove((struct Node *)tdoBase);
  266.  
  267.    L_CloseLibs();
  268.  
  269.    negsize  = tdoBase->tdb_LibNode.lib_NegSize;
  270.    possize  = tdoBase->tdb_LibNode.lib_PosSize;
  271.    fullsize = negsize + possize;
  272.    negptr  -= negsize;
  273.  
  274.    FreeMem(negptr, fullsize);
  275.  
  276.    #ifdef __MAXON__
  277.    CleanupModules();
  278.    #endif
  279.  
  280.    return(seglist);
  281.   }
  282.  
  283.  tdoBase->tdb_LibNode.lib_Flags |= LIBF_DELEXP;
  284.  
  285.  return(NULL);
  286. }
  287.  
  288. /* ----------------------------------------------------------------------------------------
  289.    ! ExtFunct:
  290.    !
  291.    ! This one is enclosed within a Forbid/Permit pair by Exec V37-40. Since a Wait() call
  292.    ! would break this Forbid/Permit(), you are not allowed to start any operations that
  293.    ! may cause a Wait() during their processing. It's possible, that future OS versions
  294.    ! won't turn the multi-tasking off, but instead use semaphore protection for this
  295.    ! function.
  296.    !
  297.    ! Currently you only can bypass this restriction by supplying your own semaphore
  298.    ! mechanism - but since this function currently is unused, you should not touch
  299.    ! it, either.
  300.    ---------------------------------------------------------------------------------------- */
  301.  
  302. ULONG ASM ExtFuncLib(void)
  303. {
  304.  return(NULL);
  305. }
  306.  
  307. struct tdoBase *tdoBase = NULL;
  308.  
  309.  
  310. /* ----------------------------------------------------------------------------------------
  311.    ! __SASC stuff:
  312.    !
  313.    ! This is only for SAS/C - its intention is to turn off internal CTRL-C handling
  314.    ! for standard C functions and to avoid calls to exit() et al.
  315.    ---------------------------------------------------------------------------------------- */
  316.  
  317. #ifdef __SASC
  318.  
  319. #ifdef ARK_OLD_STDIO_FIX
  320.  
  321. ULONG XCEXIT       = NULL; /* These symbols may be referenced by    */
  322. ULONG _XCEXIT      = NULL; /* some functions of sc.lib, but should  */
  323. ULONG ONBREAK      = NULL; /* never be used inside a shared library */
  324. ULONG _ONBREAK     = NULL;
  325. ULONG base         = NULL; /* Note, that XCEXIT/ONBREAK actually    */
  326. ULONG _base        = NULL; /* should have been defined as functions */
  327. ULONG ProgramName  = NULL; /* and not as ULONGs...                  */
  328. ULONG _ProgramName = NULL;
  329. ULONG StackPtr     = NULL;
  330. ULONG _StackPtr    = NULL;
  331. ULONG oserr        = NULL;
  332. ULONG _oserr       = NULL;
  333. ULONG OSERR        = NULL;
  334. ULONG _OSERR       = NULL;
  335.  
  336. #endif /* ARK_OLD_STDIO_FIX */
  337.  
  338. void __regargs __chkabort(void) { }  /* a shared library cannot be    */
  339. void __regargs _CXBRK(void)     { }  /* CTRL-C aborted when doing I/O */
  340.  
  341. #endif /* __SASC */
  342.  
  343.